Explorando datos de Pokémon con Pandas

Importar librerías


In [3]:
import pandas as pd

Cargar datos para crear un DataFrame


In [9]:
data = pd.read_csv('Pokemon.csv', index_col='#')

La unidad canónica de pandas es el DataFrame, que se parece a un spreadsheet en Excel. Tiene filas y columnas nombradas. Es muy fácil e intuitivo manipular.


In [ ]:

Echar un vistazo a las primeras filas


In [10]:
data.head()


Out[10]:
Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed
#
1 Bulbasaur Grass Poison 318 45 49 49 65 65 45
2 Ivysaur Grass Poison 405 60 62 63 80 80 60
3 Venusaur Grass Poison 525 80 82 83 100 100 80
3 VenusaurMega Venusaur Grass Poison 625 80 100 123 122 120 80
4 Charmander Fire NaN 309 39 52 43 60 50 65

Trabajando con un Pandas "Series"


In [12]:
type(data['Name'])


Out[12]:
pandas.core.series.Series

Acceder a ciertas columnas o filas


In [16]:
(data.Name == data['Name']).all()


Out[16]:
True

Un pandas "Series" es lo que le decimos a una columna de un DataFrame. Se exponen varios métodos ahí mismo, que hace que sea muy fácil preguntar cosas de él.

¿Cuál es el "total" más grande?


In [22]:
data['Total'].max()


Out[22]:
780

¿Quién tiene el total más grande?


In [23]:
total_mas_grande = data['Total'].max()

In [27]:
data[data['Total'] == total_mas_grande]['Name']


Out[27]:
#
150      MewtwoMega Mewtwo X
150      MewtwoMega Mewtwo Y
384    RayquazaMega Rayquaza
Name: Name, dtype: object

¿Cuál es el "Speed" promedio?


In [29]:
data['Speed'].mean()


Out[29]:
68.277500000000003

¿Cómo son los valores del estadístico "Attack"?


In [32]:
%matplotlib inline

Pandas nos permite hacer muchas visualizaciones desde el Series o DataFrame mismo, haciéndolo muy fácil obtener una vista ancha de la forma de tus datos.


In [33]:
data['Attack'].hist()


Out[33]:
<matplotlib.axes._subplots.AxesSubplot at 0x111cd0a90>

Solo para estar seguro..


In [34]:
data['Attack'].min()


Out[34]:
5

In [35]:
data['Attack'].max()


Out[35]:
190

Cuantos de cada "Type 1" y "Type 2" tenemos?


In [ ]:


In [ ]:

"Aggregation"

¿Cuál es el "Total" promedio de cada Pokémon de "Type 1" y "Type 2"?


In [42]:
data.groupby('Type 2')['Total'].mean().sort_values(ascending=False)


Out[42]:
Type 2
Dragon      526.166667
Fighting    525.846154
Ice         525.714286
Fire        506.250000
Steel       485.227273
Dark        484.400000
Psychic     479.060606
Electric    455.333333
Flying      452.546392
Ground      444.342857
Rock        434.642857
Ghost       430.714286
Water       418.214286
Fairy       417.956522
Normal      411.500000
Grass       408.920000
Poison      396.500000
Bug         393.333333
Name: Total, dtype: float64

¿Cuál es el "Attack" máximo de cada combinación de "Type 1" y "Type 2"?


In [46]:
data.groupby(['Type 1', 'Type 2'])['Attack'].max().sort_values(ascending=False)


Out[46]:
Type 1    Type 2  
Psychic   Fighting    190
Bug       Fighting    185
Ground    Fire        180
Dragon    Flying      180
          Ice         170
          Ground      170
Rock      Dark        164
Fire      Fighting    160
Rock      Fairy       160
Psychic   Dark        160
Water     Dark        155
Bug       Flying      155
          Poison      150
Dragon    Electric    150
Steel     Ghost       150
Water     Ground      150
Bug       Steel       150
Fighting  Steel       145
Steel     Psychic     145
Ground    Flying      145
Rock      Flying      140
Ground    Rock        140
Normal    Fighting    136
Ground    Steel       135
Grass     Ice         132
Dark      Flying      131
Fire      Flying      130
Ice       Ground      130
Dragon    Psychic     130
Grass     Fighting    130
                     ... 
Poison    Dragon       75
Electric  Steel        70
Water     Grass        70
Ground    Psychic      70
Flying    Dragon       70
Normal    Fairy        70
Fire      Psychic      69
          Normal       68
Grass     Fairy        67
Ground    Electric     66
Ghost     Poison       65
Electric  Water        65
          Fire         65
          Ice          65
          Grass        65
Water     Ghost        60
Poison    Water        60
Electric  Fairy        58
Water     Electric     58
Normal    Ground       56
Ghost     Fire         55
Rock      Steel        55
Electric  Normal       55
Fire      Rock         50
Poison    Bug          50
Water     Fairy        50
Ice       Psychic      50
Fairy     Flying       50
Electric  Ghost        50
Bug       Water        30
Name: Attack, dtype: int64

Visualizar con seaborn


In [49]:
import seaborn as sns

Visualizar una columna contra otra


In [51]:
sns.jointplot(x='Sp. Atk', y='Sp. Def', data=data, kind='reg')


Out[51]:
<seaborn.axisgrid.JointGrid at 0x11380e630>

In [50]:
data.head()


Out[50]:
Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed
#
1 Bulbasaur Grass Poison 318 45 49 49 65 65 45
2 Ivysaur Grass Poison 405 60 62 63 80 80 60
3 Venusaur Grass Poison 525 80 82 83 100 100 80
3 VenusaurMega Venusaur Grass Poison 625 80 100 123 122 120 80
4 Charmander Fire NaN 309 39 52 43 60 50 65

Crear un boxplot de las columnas que nos importan


In [53]:
sns.boxplot(data = data.drop(['Name', 'Total'], axis=1).head())


Out[53]:
<matplotlib.axes._subplots.AxesSubplot at 0x113a778d0>